<?php
namespace app\api\controller;

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use Qcloud\Sms\SmsSingleSender;
use app\api\common\Common;
use app\api\common\ApiErrDesc;

class MsgCode extends Common {

    /**
     * 查询查询账号是否存在于数据库
     * @return [json]    [返回查询结果]
     */
    public function get_username_status(){
        $username = $this->params['user_name'];
        $username_type = $this->check_username($username);
        $searchRes = db('user')->where($username_type.'="'.$username.'"')->find();
        $resInfo = array();
        $resInfo['res'] = $searchRes ? 1 : 0;
        $this->return_msg(ApiErrDesc::SUCCESS[0], ApiErrDesc::SUCCESS[1], $resInfo);
    }

    /**
     * 发送手机或短信验证码
     * @return [json]   [返回发送结果]
     */
    public function get_code() {
        $username = $this->params['user_name'];
        $exist = $this->params['is_exist'];
        // 用户名检测在很多地方都使用到，所以提到Common.php
        $username_type = $this->check_username($username);
        // 检查用户名, 决定用下面哪那个函数
        switch ($username_type) {
            case 'phone':
                $this->get_code_by_username($username, 'phone', $exist); // 通过手机获取验证码
                break;
            case 'email':
                $this->get_code_by_username($username, 'email', $exist); // 通过邮箱获取验证码
                break;
        }
    }

    /**
     * 通过手机号/邮箱发送验证码code
     * @param [string] $username 手机号或邮箱
     * @param [int]    $exist [手机号是否存在于数据库中1：是 0否]
     * @param [string] $type  [是邮箱还是手机]
     * @return [json]         [api返回的json数据]
     */
    public function get_code_by_username($username, $type, $exist) {
        if ($type == 'phone') {
            $type_name = '手机';
        } else {
            $type_name = '邮箱';
        }

        // 检测手机号是否存在
        $this->check_exist($username, $type, $exist);

        // 检查验证码请求频率 60秒一次
        if (session("?" . str_replace('.', '', $username) . '_last_send_time')) {
            if (time() - session(str_replace('.', '', $username) . '_last_send_time') < 60) {
                $this->return_msg(ApiErrDesc::REPEATSEND[0], $type_name . ApiErrDesc::REPEATSEND[1]);
            }
        }

        // 生成验证码
        $code = $this->make_code(6);

        // 使用session存储验证码, 方便比对, md5加密
        $md5_code = md5($username . '_' . md5($code));
        session(str_replace('.', '', $username) . '_code', $md5_code);

        // 使用session存储验证码的发送时间
        session(str_replace('.', '', $username) . '_last_send_time', time());

        // 发送验证码
        if ($type == 'phone') {
            $this->send_code_to_phone($username, $code);
        } else {
            $this->send_code_to_email($username, $code);
        }
    }

    /**
     * 生成验证
     * @param [int] $num 验证码的位数
     * @return [type]    生成的验证码
     */
    public function make_code($num) {
        $max = pow(10, $num) - 1;
        $min = pow(10, $num - 1);
        return rand($min, $max);
    }

    /**
     * 腾讯云短信验证码发送
     * @param  [string] $phone  [发送的手机号码]
     * @param  [int]    $code   [验证码]
     * @return [json]           [返回结果]
     */
    public function send_code_to_phone($phone, $code) {
        $tophone = $phone;

        // 本地测试直接返回信息短信验证码
        $this->return_msg(ApiErrDesc::SUCCESS[0], ApiErrDesc::SUCCESS[1] . $code);
    }

    /**
     * 向邮箱发送验证码
     * @param [string] $email [目标email]
     * @param [int]    $code  [验证码]
     * @return [json]         [返回发送结果]
     */
    public function send_code_to_email($email, $code) {
        // 邮箱
        $toemail = $email;
        // 实例化和传递true可启用异常

        // 本地测试直接返回信息短信验证码
        $this->return_msg(ApiErrDesc::SUCCESS[0], ApiErrDesc::SUCCESS[1] . $code);
    }
}